package pe.com.rimac.portal.facturacion.servicio.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import pe.com.rimac.portal.common.exception.ServiceException;
import pe.com.rimac.portal.common.model.TipoDocumento;
import pe.com.rimac.portal.facturacion.handler.SearchCriteria;
import pe.com.rimac.portal.facturacion.modelo.Factura;
import pe.com.rimac.portal.facturacion.modelo.Persona;
import pe.com.rimac.portal.facturacion.modelo.PersonaJuridica;
import pe.com.rimac.portal.facturacion.modelo.PersonaNatural;
import pe.com.rimac.portal.facturacion.servicio.AseguradoService;
import pe.com.rimac.portal.service.facturacion.FacturacionService;
import pe.com.rimac.portal.service.facturacion.modelo.Documento;
import pe.com.rimac.portal.service.facturacion.request.FacturacionRequest;
import pe.com.rimac.portal.service.paperless.PaperlessService;
import pe.com.rimac.portal.service.paperless.model.PaperlessRequest;
import pe.com.rimac.portal.service.paperless.model.TipoRetorno;

/**
 * Clase que implementa los m&eacute;todos declarados en {@link AseguradoService} para consultar y actualizar
 * informaci&oacute;n correspondiente a facturaci&oacute;n electr&oacute;nica.
 * 
 * @author Andres Deza Villacorta - Synopsis S.A
 * 
 */
public class AseguradoServiceImpl implements AseguradoService
{
	@Autowired
	private FacturacionService facturacionService;
	@Autowired
	private PaperlessService paperlessService;

	/**
	 * @see pe.com.rimac.portal.facturacion.servicio.AseguradoService#obtenerFacturas(pe.com.rimac.portal.facturacion.handler.SearchCriteria)
	 */
	public List<Factura> obtenerFacturas(SearchCriteria searchCriteria) throws ServiceException
	{
		List<Documento> resultados = facturacionService.obtenerDocumentos(obtenerRequest(searchCriteria),
				searchCriteria.getCriterioBusqueda());
		return obtenerFacturas(resultados);
	}

	/**
	 * @see pe.com.rimac.portal.facturacion.servicio.AseguradoService#obtenerURLFacturaDigital(pe.com.rimac.portal.facturacion.modelo.Factura,
	 *      pe.com.rimac.portal.service.paperless.model.TipoRetorno, java.lang.String, java.lang.String)
	 */
	public String obtenerURLFacturaDigital(Factura factura, TipoRetorno tipoRetorno, String username, String password)
			throws ServiceException
	{
		PaperlessRequest request = new PaperlessRequest();
		request.setTipoDocumento(TipoDocumento.fromStringValue(factura.getTipo()));
		request.setSerieDocumento(factura.getSerie());
		request.setNumeroDocumento(factura.getDocumento());
		return paperlessService.obtenerURLFactura(request, tipoRetorno, username, password);
	}

	/**
	 * @see pe.com.rimac.portal.facturacion.servicio.AseguradoService#obtenerDatosFacturacion(java.lang.String,
	 *      java.lang.String)
	 */
	public Persona obtenerDatosFacturacion(String tipoDocumento, String numeroDocumento) throws ServiceException
	{
		return null;
	}

	/**
	 * @see pe.com.rimac.portal.facturacion.servicio.AseguradoService#actualizarDatosFacturacion(pe.com.rimac.portal.facturacion.modelo.Persona)
	 */
	public void actualizarDatosFacturacion(Persona persona) throws ServiceException
	{
		if (persona instanceof PersonaNatural)
		{
			// TODO: Realizar invocacion al servicio de actualizacion de datos
		}
		else if (persona instanceof PersonaJuridica)
		{
			// TODO: Realizar invocacion al servicio de actualizacion de datos
		}
	}

	/**
	 * @param documentos
	 * @return
	 */
	private List<Factura> obtenerFacturas(List<Documento> documentos)
	{
		List<Factura> facturas = new ArrayList<Factura>();
		for (Documento documento : documentos)
		{
			Factura factura = new Factura();
			factura.setResponsable(StringUtils.replace(documento.getNombreResponsablePago(), "null", ""));
			factura.setDireccion(StringUtils.replace(documento.getDireccionReponsablePago(), "null", ""));
			factura.setTipoFactura(StringUtils.replace(documento.getTipoFactura(), "null", ""));
			factura.setNumero(StringUtils.replace(documento.getNumeroFactura(), "null", ""));
			factura.setFechaEmision(StringUtils.replace(documento.getFechaEmisionDocumento(), "null", ""));
			factura.setDocumento(StringUtils.replace(documento.getNumero(), "null", ""));
			factura.setCodigoProducto(StringUtils.replace(documento.getCodigoProducto(), "null", ""));
			factura.setProducto(StringUtils.replace(documento.getProducto(), "null", ""));
			factura.setPoliza(StringUtils.replace(documento.getNumeroPoliza(), "null", ""));
			factura.setMoneda(StringUtils.replace(documento.getCodigoMoneda(), "null", ""));
			factura.setImporte(StringUtils.replace(documento.getImporte(), "null", ""));
			factura.setBoletaCobro(StringUtils.replace(documento.getNumeroBoletaCobro(), "null", ""));
			factura.setCodigoEstado(StringUtils.replace(documento.getCodigoEstado(), "null", ""));
			factura.setEstado(StringUtils.replace(documento.getEstado(), "null", ""));
			factura.setTipo(StringUtils.replace(documento.getTipo(), "null", ""));
			factura.setSerie(StringUtils.replace(documento.getSerie(), "null", ""));
			factura.setCodigoEmpresa(StringUtils.replace(documento.getCodigoEmpresa(), "null", ""));
			factura.setNombreEmpresa(StringUtils.replace(documento.getNombreEmpresa(), "null", ""));
			factura.setNumIdResponsable(StringUtils.replace(documento.getNumIdResponsablePago(), "null", ""));
			factura.setMultiDocumento(StringUtils.replace(documento.getIndicadorMultiDocumento(), "null", ""));
			factura.setMultiPoliza(StringUtils.replace(documento.getIndicadorMultiPoliza(), "null", ""));
			facturas.add(factura);
		}
		return facturas;
	}

	/**
	 * Crea el request para realizar la consulta al servicio de facturaci&oacute;n electr&oacute;nica.
	 * 
	 * @param searchCriteria
	 * @return
	 */
	private FacturacionRequest obtenerRequest(SearchCriteria searchCriteria)
	{
		FacturacionRequest request = new FacturacionRequest();
		request.setDocumentoCobro(searchCriteria.getDocumentoCobro());
		request.setEmpresa(searchCriteria.getCodigoEmpresa());
		request.setFechaInicio(searchCriteria.getFechaInicio());
		request.setFechaFin(searchCriteria.getFechaFin());
		request.setNumeroDocumentoSUNAT(searchCriteria.getNumeroDocumentoSUNAT());
		request.setSerieDocumentoSUNAT(searchCriteria.getSerieDocumentoSUNAT());
		request.setTipoDocumentoSUNAT(searchCriteria.getTipoDocumentoSUNAT());
		request.setProductoFechaInicio(searchCriteria.getProductoFechaInicio());
		request.setProductoFechaFin(searchCriteria.getProductoFechaFin());
		request.setCodigoProducto(searchCriteria.getProducto());
		request.setPoliza(searchCriteria.getPoliza());
		request.setTipoDocumento(searchCriteria.getTipoDocumentoCliente());
		request.setNumeroDocumento(searchCriteria.getNumeroDocumentoCliente());
		return request;
	}
}